# -*- coding: utf-8 -*-
# @Time    : 2019/10/30 17:25
# @Author  : LiHaowen
# @Email   : lihaowen2017@163.com
# @File    : coroutine_test.py

# def get_url(url):
#     # do something 1
#     html = get_html(url)  # 此处暂停，切换到另一个函数去执行
#     # parse_html
#     urls = parse_url(html)
#
# def get_url2():
#     pass
#
# # 传统函数调用过程 A->B->C
# # 我们需要一个可以暂停的函数，并且可以在适当的时候回复该函数的继续执行
# # 出现了协程 -> 有多个入口的函数，可以暂停的函数，可以暂停的函数（可以向暂停的地方传入值）


def gen_func():
    # 1. 可以产出值； 2. 可以接收值(调用方传递进来的值）
    html = yield "http://projectsedu.com"  # yield 在表达式右边，有一个特性，将值传递给生成器的内部
    print(html)
    yield 2
    yield 3
    return "b1"

# 1. throw 传入一个异常, close


if __name__ == '__main__':
    gen = gen_func()
    # 在调用send发送非none值之前，我们必须启动一次生成器，方式有两种1. gen.send(None) 2. next(gen)
    # 1. 启动生成器方式有两种， next(), send
    # url = gen.send("bobby")  # TypeError: can't send non-None value to a just-started generator
    # 生成器对象第一次生成的时候必须send一个None值，初始化时没有运行到yield "http://projectsedu.com"此行代码
    url = gen.send(None)
    # print(url)
    #
    # download url
    html = "b2"
    gen.send(html)
    # print(gen.send(html))  # send方法可以传递值进入生成器内部，同时还可以重启生成器执行到下一个yield位置

    # print(next(gen))
    # print(next(gen))
    # print(next(gen))
    # for i in gen:
    #     print(i)
